home *** CD-ROM | disk | FTP | other *** search
/ Windows 95 API Bible / Windows 95 API Bible 3 Disc Set.iso / Win32 API Bible Book 1 of 3 / CHAPTE25 / EX20.C < prev    next >
C/C++ Source or Header  |  1995-04-24  |  4KB  |  84 lines

  1. #include <genstub.c>
  2.  
  3. // Hot key values.
  4. #define RESUME_KEY    101
  5. #define SUSPEND_KEY   102
  6. #define TERMINATE_KEY 103
  7.  
  8. DWORD WINAPI ThreadProc(HWND hWnd)
  9. {
  10.     TCHAR szBuffer[128];
  11.     wsprintf( szBuffer, "Starting Thread ID = %lX", GetCurrentThreadId() );
  12.     SetWindowText( hWnd, szBuffer );
  13.     Sleep( 5000 );
  14.     wsprintf( szBuffer, "Thread %lX finished execution", GetCurrentThreadId() );
  15.     SetWindowText( hWnd, szBuffer );
  16.     ExitThread( TRUE );
  17. }
  18.  
  19. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  20. {
  21.     static  HANDLE hChild = 0;
  22.  
  23.     switch (uMsg)
  24.     {
  25.             case WM_CREATE:
  26.                     RegisterHotKey(hWnd, RESUME_KEY, MOD_ALT, 'R');
  27.                     RegisterHotKey(hWnd, SUSPEND_KEY, MOD_ALT, 'S');
  28.                     RegisterHotKey(hWnd, TERMINATE_KEY, MOD_ALT, 'K');
  29.                     return DefWindowProc( hWnd, uMsg, wParam, lParam );
  30.             case WM_DESTROY:
  31.                     UnregisterHotKey(hWnd, RESUME_KEY);
  32.                     UnregisterHotKey(hWnd, SUSPEND_KEY);
  33.                     UnregisterHotKey(hWnd, TERMINATE_KEY);
  34.                     PostQuitMessage( 0 );
  35.                     break;
  36.             case WM_HOTKEY:
  37.                     {
  38.                        TCHAR szBuffer[128];
  39.                        DWORD dwExitCodeThread = STILL_ACTIVE;
  40.                        lstrcpy( szBuffer, "No Child Thread Running" );
  41.                        if (hChild)
  42.                           GetExitCodeThread(hChild, &dwExitCodeThread);
  43.                        if (dwExitCodeThread==STILL_ACTIVE)
  44.                           switch (wParam)
  45.                           {
  46.                              case SUSPEND_KEY:
  47.                                  wsprintf( szBuffer, "Suspending thread %lX", hChild );
  48.                                  SuspendThread(hChild);
  49.                                  break;
  50.                              case RESUME_KEY:
  51.                                  wsprintf( szBuffer, "Resuming thread %lX", hChild );
  52.                                  ResumeThread(hChild);
  53.                                  break;
  54.                              case TERMINATE_KEY:
  55.                                  wsprintf( szBuffer, "Terminating thread %lX", hChild );
  56.                                  TerminateThread(hChild, FALSE);
  57.                                  break;
  58.                           }
  59.                        SetWindowText( hWnd, szBuffer );
  60.                     }
  61.                     break;
  62.             case WM_COMMAND:  // Process menu items.
  63.                     switch ( LOWORD( wParam )  )
  64.                     {
  65.                         case IDM_TEST:
  66.                            {  // Start a thread. Only one thread at at time.
  67.                               DWORD dwExitCodeThread;
  68.                               DWORD dwChild;
  69.                               if (hChild)
  70.                                  GetExitCodeThread( hChild, &dwExitCodeThread );
  71.                               if (dwExitCodeThread!=STILL_ACTIVE)
  72.                                  hChild = CreateThread(NULL, 0, ThreadProc, hWnd, 0, &dwChild );
  73.                            }
  74.                            break;
  75.                         case IDM_EXIT:
  76.                               DestroyWindow( hWnd );
  77.                               break;
  78.                     }
  79.             break;
  80.             default:
  81.                  return DefWindowProc( hWnd, uMsg, wParam, lParam );
  82.     }
  83.     return NULL;
  84. }